package com.niaobulashi.queue;

import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.concurrent.TimeUnit;

/**
 * 消息消费者
 *
 * @author yamikaze
 */
@Slf4j
public class Customer extends Thread {

    private String customerName = "queue_customer";

    private volatile int count;

    private RedisTemplate redisTemplate;

    public void init(RedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }


    public void processMessage() {
        String message = (String) redisTemplate.opsForList().rightPop(Producer.MESSAGE_KEY);
        if (message != null) {
            count++;
            handle(message);
        } else {
            log.info("consume queue sleep");
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public void handle(String message) {
        log.info(customerName + " 正在处理消息,消息内容是: " + message + " 这是第" + count + "条");
    }


    @Override
    public void run() {
        while (true) {
            processMessage();
            // processMessage2();
        }
    }


    public void processMessage2() {
        /**
         * brpop支持多个列表(队列)
         * brpop指令是支持队列优先级的，比如这个例子中MESSAGE_KEY的优先级大于testKey（顺序决定）。
         * 如果两个列表中都有元素，会优先返回优先级高的列表中的元素，所以这儿优先返回MESSAGE_KEY
         * 0表示不限制等待，会一直阻塞在这儿
         */
        // 阻塞式brpop，List中无数据时阻塞，参数0表示一直阻塞下去，直到List出现数据
        String messages = (String) redisTemplate.opsForList().rightPop(Producer.MESSAGE_KEY, 0, TimeUnit.MINUTES);
        //阻塞，取出临时队列
        if (messages != null) {
            handle(messages);
        }
        System.out.println("=======================");
    }
}